package kernel.stl;

/**Representa um ponto 2D.
 * @author George
 */
public class PointXY {
    
    private double x;
    private double y;
    
    /**Construtor do ponto 2D. 
     * @param x coordenada x.
     * @param y coordenada y.
     */
    public PointXY(double x, double y) {
        this.x = x;
        this.y = y;
    }
    
    /**Verifica a igualdade com outro ponto.
     * Para determinar esta igualdade, é levada em consideração uma tolerância.
     * Caso a distância entre os dois pontos seja menor ou igual à tolerância, 
     * então eles serão considerados iguais.
     * @param otherPoint ponto usado como comparação.
     * @param tolerance tolerância usada na comparação.
     * @return True se os dois pontos forem iguais ou false no caso contrário.
     */
    public boolean equals(PointXY otherPoint, double tolerance) {
        if (this.distanceTo(otherPoint) > tolerance)
            return false;
        else
            return true;
    }
    
    public boolean equals(PointXY otherPoint) {
        if (this.getX() == otherPoint.getX() && this.getY() == otherPoint.getY())
            return true;
        else
            return false;
    }
    
    /**Calcula a distância para outro ponto.
     * A distância d é dada por: d = sqrt((x2 - x1)^2 + (y2 - y1)^2). 
     * @param otherPoint ponto de referência para cálculo da distância.
     * @return distância entre os dois pontos.
     */
    
    public double distanceTo(PointXY otherPoint) {        
        double deltaX = Math.abs(this.getX() - otherPoint.getX());
        double deltaY = Math.abs(this.getY() - otherPoint.getY());
        
        return (double) Math.sqrt(deltaX * deltaX + deltaY * deltaY);        
    }
    
    public PointXYZ toPointXYZ() {
        return new PointXYZ(this.getX(), this.getY(), 0);
    }
    
    /**Retorna uma string que representa o ponto 2D.
     * @return string representação em string do ponto.
     */    
    public String asString() {
        return "(" + x + ", " + y + ")";
    }
    
    public void moveX(double offset) {
        this.x = this.x + offset;
    }
    
    public void moveY(double offset) {
        this.y = this.y + offset;
    }
    
    public double getX() {
        return this.x;        
    }
    
    public double getY() {
        return this.y;
    }

}
